﻿//#include <iostream>
//
//using namespace std;

//class Person
//{
//public:
//	virtual void BuyTicket() 
//	{ 
//		cout << "买票-全价" << endl;
//	}
//};

//class Person 
//{
//public:
//virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//
//class Student : public Person 
//{
//public:
//virtual void BuyTicket() { cout << "买票-打折" << endl; }
//};
//
//void Func(Person* ptr)
//{
//// 虽然都是Person指针ptr在调用BuyTicket
//// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}

//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};

//class Car 
//{
//public:
//	virtual void Drive()
//	{}
//};
//class Benz :public Car 
//{
//public:
//	virtual void Drive() override { cout << "Benz-舒适" << endl; }
//};

//class Car
//{
//public:
//	virtual void Drive() final {}
//};
//class Benz :public Car
//{
//public:
//  //报错，final修饰的虚函数不能被重写
//	virtual void Drive() { cout << "Benz-舒适" << endl; }
//};
//
//int main()
//{
//	B* p = new B;
//	p->test();
//	return 0;
//}


//class A {};
//class B : public A {};
//
//class Person {
//public:
//	virtual A* BuyTicket()
//	{
//		cout << "买票-全价" << endl;
//		return nullptr;
//	}
//};
//class Student : public Person {
//public:
//	virtual B* BuyTicket()
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}

//重写析构函数
//class A
//{
//public:
//	virtual ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//
//class B : public A {
//public:
//	~B()
//	{
//		cout << "~B()->delete:" << _p << endl;
//		delete _p;
//	}
//protected:
//	int* _p = new int[10];
//};
//
//void func(A* ptr)
//{
//	//ptr->f();
//	delete ptr;
//	// ptr->destructor()     // 构成多态
//	// operator delete(ptr)
//}
//
//
//int main()
//{
//	/*A aa1;
//	B bb1;*/
//
//	func(new A);
//	func(new B);
//
//	/*A* p1 = new A;
//	A* p2 = new B;
//
//	delete p1;
//	delete p2;*/
//
//	return 0;
//}


//// 基类
//class Base 
//{
//public:
//    virtual ~Base() { cout << "~Base()" << endl; }
//};
//
//// 派生类
//class Derived : public Base 
//{
//public:
//    ~Derived() 
//    {
//        // 释放资源 
//        cout << "~Derived()->delete: " << _ptr << endl;
//        delete _ptr;     
//    }
//private:
//    int* _ptr = new int(10);
//};
//
//int main() 
//{
//    Base* base_ptr = new Derived;
//    delete base_ptr;
//    return 0;
//}


